package com.rui.sideup.module.udp;

import org.apache.commons.lang3.time.DateFormatUtils;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author ZhangRui
 * @date 2022/12/14 13:08
 **/
public class UdpServer {

    DatagramSocket socket;

    /**
     * 接收消息的函数
     */
    public void receiveMsg() throws Exception {

        System.out.println("udp服务已启动");

        // 创建线程，同理，接收信息也要放在线程里面接收
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    if (socket == null) {
                        socket = new DatagramSocket(60000);
                    }
                    String str;
                    List<Byte> bytes = new ArrayList<>();
                    List list = new ArrayList();
                    while (true) {
                        // 创建一个空的字节数组
                        byte[] data = new byte[1024];
                        // 将字节数组和数组的长度传进DatagramPacket 创建的对象里面
                        DatagramPacket pack = new DatagramPacket(data, data.length);
                        try {
                            // socket对象接收pack包，程序启动的时候，socket会一直处于阻塞状态，直到有信息传输进来
                            socket.receive(pack);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        // 获取发送数据的IP地址
                        // String ip = pack2.getAddress().getHostAddress();
                        // 获取发送数据端的端口号
                        // int port = pack2.getPort();
                        str = new String(pack.getData(), 0, pack.getLength()); // 将字节数组转化成字符串表现出来
                        // 开启接收端口后会持续接收数据，只有页面可见的时候才将收到的数据写入
                        System.out.println("\r\n时间:" + DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
                        System.out.println("收到了IP为：" + pack.getAddress() + ", 端口为：" + pack.getPort() + " 的消息");
                        System.out.println("消息内容：" + str);
                    }
                } catch (SocketException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}
